<?php
/**
 * Created by PhpStorm.
 * User: leo
 * Date: 16/4/6
 * Time: 上午9:48
 * Describe:
 */

namespace services\sms;

class XiAoSms extends SmsBase
{

    public $uid;
    public $auth ;
    /**
     * @var string
     */
    protected $url = 'http://sms.10690221.com:9011/hy/';

    public $errorCode = <<<EEE
        MK  这类错误是移动网关直接推过来的，一般是手机端错误,一般为空号，欠费停机，或者长时间关机等原因
        ID:0076  运营商错误代码  广东移动对批量内容的落地屏蔽，可以通过修改内容解决。一般2000条同样内容开始屏蔽，并且为随机屏蔽。
        UNDELIV  运营商错误代码  一般为空号，欠费停机，或者长时间关机。
        REJECTD  运营商错误代码  即时回来的一般为空号或停机，如果第二，三天回来的一般为目标省网关拒绝。
        UNKNOWN  运营商错误代码  没有状态报告，原因未知，该类情况很少，运营商不计费。
        YX:9402  平台自定义错误代码  非法内容，因触发移动过滤规则而自动拒绝发送，可以到系统的业务操作平台下的根据号码查询内容自助查询，根据查询结果做内容上的调整。
        YX:9403  平台自定义错误代码  手机号码黑名单，本平台黑名单来源只有2个，在运营商处投诉过，或者回T（TD）之类，在运营商投诉过的号码无法解禁。回T号码可以找客服解决。
        YX:9415  平台自定义错误代码  人工审核，判断内容不合规而拒绝发送
        YX:9422  平台自定义错误代码  人工二次审核，判断内容不合规而拒绝发送
        YX:9423  平台自定义错误代码  高危审核，判断内容不合规而拒绝发送
        YX:9432  平台自定义错误代码  整个平台验证码1分钟最多发1条。如果是测试手机，让客服加入免限手机名单。
        YX:9433  平台自定义错误代码  整个平台验证码1小时最多发5条。如果是测试手机，让客服加入免限手机名单。
        YX:9434  平台自定义错误代码  整个平台验证码1天最多可发10条，超过就被拦截，如果是测试手机联系客服加入免限名单。
        YX:9427  平台自定义错误代码  特级高危内容，系统自动拒绝
        YX:9429  平台自定义错误代码  签名超过长度（20字）限制而拒绝发送，注意后置签名的】后面不能有任何字，也不能有空格或回车等特殊符号。前置签名【前面也不能有特殊符号，包括空格或回车等。
        YX:9909  平台自定义错误代码  本平台提交到移动失败，网络偶然异常，客户侧可以通过再次提交解决。平时很少出现，节假日短信繁忙的时候容易出现。
        YX:9430   平台自定义错误代码  客户侧长短信提交不完整 请客户侧检查
        YX:9501  平台自定义错误代码  非法目标地址，即手机号码错误
        YX:9413  平台自定义错误代码  10秒以内同样内容，同样号码重复发送2次以上，系统自动拦截
        YX:9431  签名被屏蔽，因为疑是高危验证码炸弹，请核实。或者因为高投诉而被屏蔽。
        YX:9417  平台自定义错误代码  夜间模板审核，因非模板而自动拒绝发送
        YX:9420  平台自定义错误代码  夜间（晚上22点到早上8点）因群发而系统自动拒绝
        YX:9421  平台自定义错误代码  夜间（晚上22点到早上8点）因发送而系统自动拒绝
        YX:9424  平台自定义错误代码  夜间系统审核因非法字符，繁体字等判断自动拒绝发送
        XA:0001 驳回失败
        XA:0100 重号过滤
        XA:0003 签名未报备
        XA:0004 触发自动屏蔽词
        XA:0139 触发系统黑名单
        XA:2139 触发用户黑名单
        CJ:0007 包含网关拦截词
        CJ:0008 包含网关拦截
EEE;
    protected $status = array('0' => '操作成功',
        '-1' => '签权失败',
        '-2' => '未检索到被叫号码',
        '-3' => '被叫号码过多',
        '-4' => '内容未签名',
        '-5' => '内容过长',
        '-6' => '余额不足',
        '-7' => '暂停发送',
        '-8' => '保留',
        '-9' => '定时发送时间格式错误',
        '-10' => '下发内容为空',
        '-11' => '账户无效',
        '-12' => 'Ip地址非法',
        '-13' => '操作频率快',
        '-14' => '操作失败',
        '-15' => '拓展码无效',
        '-16' => '取消定时,seqid错误',
        '-17' => '未开通报告',
        '-18' => '暂留',
        '-19' => '未开通上行',
        '-20' => '暂留',
        '-21' => '包含屏蔽词');


    /**
     * @param string $cell
     * @param string $content
     * @param string $sendTime
     * @return array
     *
     *
     */
    protected function getDataStruct($cell = '', $content = '', $sendTime = '')
    {
        $data = array(

            'uid' => $this->uid,
            'auth' => md5($this->auth),
            'mobile' => $cell,
            'msg' => $content,
            'time' => $sendTime,
            'expid' => 0,
            'encode' => 'utf-8',

        );
        if ($this->marketing) {
            $data['uid'] = $this->uid.'1';
        }
        return $data;

    }


    /**
     * @param array|string $cell
     * @param string $content
     * @param int $uid
     * @param int $department
     * @param string $sendTime
     * @return bool
     */
    public function setSingleMsm($cell, $content, $uid = 0, $department = 12, $sendTime = '')
    {
        $post_data = $this->getDataStruct($cell, $content, $sendTime);
        if ($post_data['mobile'] == '' || $post_data['msg'] == '') {
            return false;
        }
        $check_flag = $this->cellCheck($cell, $content);

        if ($check_flag == true) {
            $this->saveErrorMsg('setSingleMsm', $content, '频繁发送', $cell);
            return false;
        }

        $resultFromApi = $this->curl($this->url, $post_data, 'get');

        $result = $this->parseResult($resultFromApi);
        if ($result < 0) {
            $this->saveErrorMsg('发送短信', $post_data, $resultFromApi);
        } else {
            $this->saveData($result, $cell, $content, $uid, $department, $sendTime);
        }

        return $result;
    }


    /**
     * @return int
     *
     * 返回数据样例
     * 2
     * 2015-10-30 17:16:25.0##0##18602112511##%B5%BD
     * 2015-10-30 17:16:27.0##0##18602112511##g
     */
    public function getReceivedMsg()
    {
        $data = $this->getDataStruct();
        $url = $this->url . 'mo';
        $result = $this->curl($url, $data, 'get');

        if ($result <= 0) {
            $this->saveErrorMsg('收取上行', $data, $result);
            return $result;
        }
        $messageTotal = 0;

        $resultArr = explode("\n", $result);


        foreach ($resultArr as $message) {
            $message = explode('##', $message);
            # 不符合条件的数据行忽略
            if (count($message) != 4) {
                continue;
            }

            $messageTotal++;
            /**
             * 此处与文档不同, 实际取得数据为urlencode后的gbk
             */
            $message[3] = iconv('gbk', 'utf-8', urldecode($message[3]));

            //	public function saveReceived($task_id, $cell, $content, $received = 0, $dt = null, $company='')
            $this->saveReceived(
                0,
                $message[2],
                $message[3],
                substr($message[0], 0, -2)
            );

        }
        return $messageTotal;
    }

    /**
     * @return mixed
     * 返回结果为所剩短信余额（条数）
     */
    public function getUserInfo()
    {
        $url = $this->url . 'm';

        $data = $this->getDataStruct();
        $result = $this->curl($url, $data);

        return (int)$result;
    }

    /**
     * @param string $context 接口返回数据
     * @return mixed
     * 发送成功数据 : 0,11523507 
     * 发送失败数据 : -1 
     */
    public function parseResult($context)
    {
        $arr = explode(',', $context);
        return count($arr) == 1 ? $arr[0] : $arr[1];
    }

    /**
     * 取得短信状态
     *
     * 取到内容时 $result 格式为: 时间, taskId, 手机号, 状态
     * string(306) "2015-10-29 18:34:37.0,11523507,18602112511,DELIVRD;2015-10-30 17:11:37.0,11905352,13501864073,DELIVRD;2015-10-30 17:12:25.0,11905352,18602112511,DELIVRD;2015-11-02 10:29:48.0,12700995,18602112511,DELIVRD;2015-11-02 10:35:30.0,12704216,18602112511,DELIVRD;2015-11-02 10:35:29.0,12704216,13501864073,DELIVRD;"
     * 未取到内容时 $result 格式
     * string(3) "-13"
     */
    public function getSmsStatus()
    {
        $url = $this->url . 'rpt';
        $data = $this->getDataStruct();
        $result = $this->curl($url, $data);

        if (strlen($result) < 10 && $result !== '0') {
            $this->saveErrorMsg('短信状态', $data, $result);
        }


        $resultArr = explode(';', $result);

        foreach ($resultArr as $row) {
            $data = explode(',', $row);
            $this->updateStatus($data[1], $data[2], $data[3], substr($data[0], 0, -2));

        }

    }

}